<?php
/**
 * 客户模块常规数据控制器
 * 操作表: oa_basic_customer
 * 数据类型: 1客户状态,2客户意向,3跟进方式,4销售阶段，5看后期增加
 */

declare (strict_types=1);

namespace app\controller\adm;

use app\BaseController;
use think\facade\Request;
use app\model\customer\Basic as BasicModel;

class Basic extends BaseController
{
    /**
     * 无需登录的方法
     *
     * @var array
     */
    protected $noNeedLogin = ['set', 'list'];

    /**
     * 无需权限验证的方法
     *
     * @var array
     */
    protected $noNeedRight = [];

    /**
     * 查看常规数据列表
     *
     * 支持按类型筛选，分页查询
     * @return \think\response\Json
     */
    public function list()
    {
        try {
            $param = Request::param();
            $page = max(1, (int)($param['page'] ?? 1));
            $limit = max(1, min(100, (int)($param['limit'] ?? 20)));

            // 构建查询条件
            $where = [];
            $where[] = ['status', '>=', 0]; // 获取未删除的数据

            // 按类型筛选
            if (!empty($param['types'])) {
                $where[] = ['types', '=', $param['types']];
            }

            // 按状态筛选
            if (isset($param['status']) && $param['status'] !== '') {
                $where[] = ['status', '=', (int)$param['status']];
            }

            // 关键词搜索
            if (!empty($param['keyword'])) {
                $where[] = ['title', 'like', '%' . $param['keyword'] . '%'];
            }

            // 查询数据
            $basicModel = new BasicModel();
            $total = $basicModel->where($where)->count();
            $list = $basicModel->where($where)
                ->order('types ASC, id ASC')
                ->page($page, $limit)
                ->select()
                ->toArray();

            // 处理数据类型映射
            $typeMap = [
                '1' => '客户状态',
                '2' => '客户意向',
                '3' => '跟进方式',
                '4' => '销售阶段',
                '5' => '其他'
            ];

            foreach ($list as &$item) {
                $item['type_name'] = $typeMap[$item['types']] ?? '未知类型';
                $item['status_text'] = $item['status'] == 1 ? '启用' : ($item['status'] == 0 ? '禁用' : '已删除');
            }

            return $this->success([
                'list' => $list,
                'total' => $total,
                'page' => $page,
                'limit' => $limit
            ], '获取成功');
        } catch (\Exception $e) {
            \think\facade\Log::error('获取常规数据列表异常: ' . $e->getMessage());
            return $this->error('获取失败: ' . $e->getMessage(), 500);
        }
    }

    /**
     * 查看单个常规数据
     *
     * @return \think\response\Json
     */
    public function view()
    {
        try {
            $param = Request::param();

            if (empty($param['id'])) {
                return $this->error('参数错误', 400);
            }

            $basicModel = new BasicModel();
            $data = $basicModel->where('id', $param['id'])
                ->where('status', '>=', 0)
                ->find();

            if (empty($data)) {
                return $this->error('数据不存在', 404);
            }

            // 添加类型名称
            $typeMap = [
                '1' => '客户状态',
                '2' => '客户意向',
                '3' => '跟进方式',
                '4' => '销售阶段',
                '5' => '其他'
            ];
            $data['type_name'] = $typeMap[$data['types']] ?? '未知类型';
            $data['status_text'] = $data['status'] == 1 ? '启用' : ($data['status'] == 0 ? '禁用' : '已删除');

            return $this->success($data, '获取成功');
        } catch (\Exception $e) {
            \think\facade\Log::error('查看常规数据异常: ' . $e->getMessage());
            return $this->error('获取失败: ' . $e->getMessage(), 500);
        }
    }

    /**
     * 设置常规数据（获取启用的数据列表）
     * 用于前端下拉选择框
     *
     * @return \think\response\Json
     */
    public function set()
    {
        try {
            $param = Request::param();

            $basicModel = new BasicModel();
            $where = [['status', '=', 1]];

            // 如果指定了类型，只获取该类型的数据
            if (!empty($param['types'])) {
                $where[] = ['types', '=', $param['types']];
            }

            $list = $basicModel->where($where)
                ->field('id, title as name, types')
                ->order('types ASC, id ASC')
                ->select()
                ->toArray();

            return $this->success($list, '获取成功');
        } catch (\Exception $e) {
            \think\facade\Log::error('获取常规数据设置异常: ' . $e->getMessage());
            return $this->error('获取失败: ' . $e->getMessage(), 500);
        }
    }

    /**
     * 新建常规数据
     *
     * @return \think\response\Json
     */
    public function add()
    {
        try {
            $param = Request::param();

            // 数据验证
            if (empty($param['title'])) {
                return $this->error('数据名称不能为空', 400);
            }

            if (empty($param['types'])) {
                return $this->error('数据类型不能为空', 400);
            }

            // 验证类型是否有效
            $validTypes = ['1', '2', '3', '4', '5'];
            if (!in_array($param['types'], $validTypes)) {
                return $this->error('数据类型无效', 400);
            }

            $basicModel = new BasicModel();
            $data = [
                'types' => $param['types'],
                'title' => $param['title'],
                'status' => isset($param['status']) ? (int)$param['status'] : 1,
                'create_time' => time(),
                'update_time' => 0
            ];

            $basicId = $basicModel->insert($data);

            if ($basicId) {
                return $this->success(['id' => $basicId], '添加成功');
            } else {
                return $this->error('添加失败', 500);
            }
        } catch (\Exception $e) {
            \think\facade\Log::error('新建常规数据异常: ' . $e->getMessage());
            return $this->error('添加失败: ' . $e->getMessage(), 500);
        }
    }

    /**
     * 编辑常规数据
     *
     * @return \think\response\Json
     */
    public function edit()
    {
        try {
            $param = Request::param();

            // 数据验证
            if (empty($param['id'])) {
                return $this->error('参数错误', 400);
            }

            if (empty($param['title'])) {
                return $this->error('数据名称不能为空', 400);
            }

            if (empty($param['types'])) {
                return $this->error('数据类型不能为空', 400);
            }

            // 验证类型是否有效
            $validTypes = ['1', '2', '3', '4', '5'];
            if (!in_array($param['types'], $validTypes)) {
                return $this->error('数据类型无效', 400);
            }

            $basicModel = new BasicModel();

            // 检查数据是否存在
            $exists = $basicModel->where('id', $param['id'])
                ->where('status', '>=', 0)
                ->find();

            if (!$exists) {
                return $this->error('数据不存在', 404);
            }

            $data = [
                'id' => $param['id'],
                'types' => $param['types'],
                'title' => $param['title'],
                'status' => isset($param['status']) ? (int)$param['status'] : 1,
                'update_time' => time()
            ];

            $result = $basicModel->update($data);

            if ($result !== false) {
                return $this->success([], '编辑成功');
            } else {
                return $this->error('编辑失败', 500);
            }
        } catch (\Exception $e) {
            \think\facade\Log::error('编辑常规数据异常: ' . $e->getMessage());
            return $this->error('编辑失败: ' . $e->getMessage(), 500);
        }
    }

    /**
     * 删除常规数据（软删除）
     *
     * @return \think\response\Json
     */
    public function del()
    {
        try {
            $param = Request::param();

            if (empty($param['id'])) {
                return $this->error('参数错误', 400);
            }

            $basicModel = new BasicModel();

            // 检查数据是否存在
            $exists = $basicModel->where('id', $param['id'])
                ->where('status', '>=', 0)
                ->find();

            if (!$exists) {
                return $this->error('数据不存在', 404);
            }

            // 软删除：更新状态为-1
            $result = $basicModel->where('id', $param['id'])
                ->update([
                    'status' => -1,
                    'update_time' => time()
                ]);

            if ($result !== false) {
                return $this->success([], '删除成功');
            } else {
                return $this->error('删除失败', 500);
            }
        } catch (\Exception $e) {
            \think\facade\Log::error('删除常规数据异常: ' . $e->getMessage());
            return $this->error('删除失败: ' . $e->getMessage(), 500);
        }
    }
}
